home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / equlfunk.lha / efunk.s < prev    next >
Encoding:
Text File  |  1980-01-01  |  29.8 KB  |  1,649 lines

  1.     Section    Demo,Code_C
  2.  
  3.     Opt    C-,O+,w-
  4.     opt    d+
  5.         
  6. Start:    move.l    #efbin,d0
  7.     move.l    #efbinend,d1
  8.     cmp.w    d0,d1
  9.     bne    .ok
  10.     
  11.     rts
  12.  
  13.  
  14. .ok    lea    $dff000,a5        ; hardware base address
  15.  
  16.     Move.w    $1c(a5),OldInt    ; Save Old Interupts
  17.     Move.w    $02(a5),OldDma    ; Save Old DMA
  18.  
  19.     Move.w    #$7fff,$9a(a5)    ; Clear DMA
  20.     Move.w    #$7fff,$96(a5)    ; Clear Interupts
  21.     Move.w    #$7fff,$9c(a5)    ; Clear Interupt Requests
  22.     
  23.     ********************************************************
  24.     
  25.     move.l    4,a6        ; execbase
  26.     move.b    530(a6),d0        ; execbase VBLANK_FREQUENCY
  27.     MOVE.L    #1773447,D7     ; PAL CIA TIME
  28.     cmp.b    #50,d0        ; check if 50hz
  29.     beq    _pal            
  30.     MOVE.L    #1789773,D7     ; NTSC CIA TIME
  31. _pal:    move.l    d7,deftime
  32.     divu    #125,D7         ; Default to normal 50 Hz timer
  33.     move.w    d7,ciatime
  34.     move.l    $78,old        ; store old level 6
  35.     move.l    #l6int,$78        ; install my level 6
  36.     move.b    #$7f,$bfdd00    ; all cia timers off
  37.     move.b    #%00010001,$bfde00    ; cra
  38.     move.b    #%10000001,$bfdd00    ; icr
  39.     move.w    ciatime,d7
  40.     MOVE.B    d7,$bfd400
  41.     LSR.W    #8,D7
  42.     MOVE.B    d7,$bfd500
  43.  
  44.     *********************************************************    
  45.     
  46.     Move.b    #$7f,$bfed01    ; kill timers (rem me for disk)
  47.     Move.l    $6c.w,OldV3        ; save level 3 int
  48.  
  49.     Move.l    #cf_level3,$6c.w    ; put new copper interupt
  50.     Move.l    #cf_copper,$80(a5)     ; Address of copper 1
  51.     Move.l    #dead_copper,$84(a5)     ; Address of copper 1
  52.  
  53.     Move.w    #$e010,$9a(a5)    ; Start interupts
  54.  
  55.     Move.w    #$83df,$96(a5)    ; Start DMA ( 83ff for disk dma)
  56.     Move.w    #1,$88(a5)        ; Strobe for copper start
  57.  
  58.     bsr    mt_init
  59.     st    mt_enable
  60.  
  61.  
  62. wait:    btst    #6,$bfe001
  63.     bne.s    wait        ; wait for lmb
  64.  
  65.     sf    mt_enable
  66.     bsr    mt_end
  67.  
  68.     lea    $dff000,a5        ; hardware base address
  69.     move.l    #0,$80(a5)        ; blank copper list
  70.     move.l    #0,$84(a5)        ; if gfx lib not open (slayer boot)
  71.     move.w    #0,$180(a5)        ; bgc to black
  72.     
  73.     Move.l    OldV3,$6c.w        ; restore old l3
  74.     move.l    old,$78        ; restore old level 6
  75.  
  76.     Lea    GfxLib,a1        ; Pointer to Library Text
  77.     move.l    4.w,a6
  78.     jsr    -132(a6)        ; forbid
  79.     Move.l    4.w,a6        ; Exec
  80.     Moveq.l    #0,d0        ; Clear D0
  81.     Jsr    -$228(a6)        ; Open Library
  82.     cmp.l    #0,d0
  83.     beq    no_gfx_lib        ; if gfx lib not open dont restore copper lib (slayer boot)
  84.     
  85.     Move.l    d0,a1            
  86.     Move.l    $26(a1),$80(a5)    ; restore copper 1
  87.     Move.l    $32(a1),$84(a5)    ; restore copper 2
  88. no_gfx_lib:
  89.  
  90.     Move.w    OldInt,d0        ; start old interupts
  91.     Or.w    #$8000,d0
  92.     Move.w    d0,$9a(a5)
  93.     Move.w    OldDma,d0        ; start old DMA
  94.     Or.w    #$8000,d0
  95.     Move.w    d0,$96(a5)
  96.     Move.b    #$9b,$bfed01    ; Start Timers
  97.     Move.l    4.w,a6        ; Close Gfx lib
  98.     Jsr    -$19e(a6)
  99.     move.l    4.w,a6
  100.     jsr    -138(a6)        ; permit
  101.  
  102.     move.w    #0,$bfec00        ; clear kbd
  103.  
  104.     Moveq.l    #0,d0        ; No errors
  105.     Rts            ; Exit
  106.  
  107.  
  108. cf_level3:
  109.     Movem.l    d0-d7/a0-a6,-(a7)    ; New copper
  110.     Move.w    #$10,$dff09c    ; Serviced Interupt
  111.  
  112.  
  113.     bsr    do_funk
  114.  
  115.     btst    #10,$dff016
  116.     bne    .Exit
  117.  
  118.     move.w    #$444,$dff180
  119.  
  120. .Exit    Movem.l    (a7)+,d0-d7/a0-a6
  121.     Rte            ; Return from Interupt
  122.  
  123.     ****************************************************
  124.  
  125. do_funk:    *-------------------------*
  126.  
  127.     move.l    copper2_ptr+0,a0
  128.     move.l    #$2c01fffe,d6
  129.     
  130.     move.l    d6,(a0)+
  131.     move.l    #$01001200,(a0)+
  132.     move.l    #1<<24,d5
  133.     
  134.     move.l    showsound1,a1
  135.     lea    red_coltrans,a3
  136.     cmp.w    #64,showlen1
  137.     bge    .ok1
  138.     lea    null,a1
  139. .ok1    bsr    .plotfunk
  140.     move.l    showsound2,a1
  141.     lea    green_coltrans,a3
  142.     cmp.w    #64,showlen2
  143.     bge    .ok2
  144.     lea    null,a1
  145. .ok2    bsr    .plotfunk
  146.     move.l    showsound3,a1
  147.     lea    blue_coltrans,a3
  148.     cmp.w    #64,showlen3
  149.     bge    .ok3
  150.     lea    null,a1
  151. .ok3    bsr    .plotfunk
  152.     move.l    showsound4,a1
  153.     lea    yellow_coltrans,a3
  154.     cmp.w    #64,showlen4
  155.     bge    .ok4
  156.     lea    null,a1
  157. .ok4    bsr    .plotfunk
  158.     
  159.  
  160.     move.l    #$fffffffe,(a0)+
  161.  
  162.     move.l    copper2_ptr,d0
  163.     move.l    copper2_ptr+4,copper2_ptr
  164.     move.l    d0,copper2_ptr+4
  165.     move.l    d0,$dff084
  166.  
  167.     *-------------------------*
  168.  
  169.     bsr    update_equals
  170.  
  171.     rts
  172.  
  173. .plotfunk
  174.     move.w    #63,d7
  175.     lea    sampletable,a2
  176. .loop
  177.  
  178.     moveq.l    #0,d0
  179.     move.b    (a1)+,d0
  180.     move.b    (a2,d0.w),d0
  181.     lsr.w    #3,d0
  182.  
  183.     move.w    d0,d1
  184.     lsr.w    #1,d1
  185.     move.w    #$182,(a0)+
  186.     asl.w    #1,d1
  187.     move.w    (a3,d1.w),(a0)+
  188.  
  189.     mulu    #40,d0
  190.     
  191.     add.l    #efbin,d0
  192.     move.w    #$e2,(a0)+
  193.     move.w    d0,(a0)+
  194.     swap    d0
  195.     move.w    #$e0,(a0)+
  196.     move.w    d0,(a0)+
  197.     
  198.     add.l    d5,d6
  199.     bcc.s    .ok
  200.     move.l    #$ffe1fffe,(a0)+
  201. .ok    move.l    d6,(a0)+
  202.  
  203.     dbf    d7,.loop    
  204.  
  205.     rts
  206.     
  207.     ******************
  208.  
  209. l6int:    move.w    #$2000,$dff09c    ; serviced interupt
  210.     tst.b    $bfdd00        ; restart timers
  211.  
  212.     add.b    #1,counter
  213.     btst.b    #0,counter
  214.     bne    .not
  215.     
  216.     bsr    mt_music
  217.  
  218. .not    rte
  219.  
  220. ciatime:        dc.l    0
  221. deftime:        dc.l    0
  222. old:        dc.l    0
  223. counter:        dc.w    0
  224.  
  225.  
  226.     ******************
  227.  
  228. update_equals:
  229.  
  230.     moveq    #0,d0
  231.     cmp.w    #0,showlen1
  232.     bmi    len_ok1
  233.     LEA    mt_chan1temp,A6
  234.     clr.l    d0
  235.     MOVE.W    n_period(A6),D0
  236.     beq    len_ok1
  237.     move.l    #35469,d1
  238.     divu    d0,d1
  239.     ext.l    d1
  240.     sub.w    d1,showlen1
  241.     add.l    d1,showsound1
  242.  
  243. len_ok1:    cmp.w    #0,showlen2
  244.     bmi    len_ok2
  245.     LEA    mt_chan2temp,A6
  246.     clr.l    d0
  247.     MOVE.W    n_period(A6),D0
  248.     beq    len_ok2
  249.     move.l    #35469,d1
  250.     divu    d0,d1
  251.     ext.l    d1
  252.     sub.w    d1,showlen2
  253.     add.l    d1,showsound2
  254.  
  255. len_ok2:    cmp.w    #0,showlen3
  256.     bmi    len_ok3
  257.     LEA    mt_chan3temp,A6
  258.     clr.l    d0
  259.     MOVE.W    n_period(A6),D0
  260.     beq    len_ok3
  261.     move.l    #35469,d1
  262.     divu    d0,d1
  263.     ext.l    d1
  264.     sub.w    d1,showlen3
  265.     add.l    d1,showsound3
  266.  
  267. len_ok3:    cmp.w    #0,showlen4
  268.     bmi    len_ok4
  269.     LEA    mt_chan4temp,A6
  270.     clr.l    d0
  271.     MOVE.W    n_period(A6),D0
  272.     beq    len_ok4
  273.     move.l    #35469,d1
  274.     divu    d0,d1
  275.     ext.l    d1
  276.     sub.w    d1,showlen4
  277.     add.l    d1,showsound4
  278.  
  279. len_ok4:    rts
  280.  
  281.  
  282.     **********************************************
  283.  
  284. ;---- Tempo ----
  285.  
  286. SetTempo    cmp.w    #32,d0
  287.     bhs.s    setemsk
  288.     moveq    #32,d0
  289. setemsk    move.w    d0,realtempo
  290.  
  291.     move.l    deftime,d2
  292.     divu    d0,d2
  293.  
  294.     move.w    d2,ciatime
  295.  
  296.     move.b    d2,$bfd400
  297.     lsr.w    #8,d2
  298.     move.b    d2,$bfd500
  299.     rts
  300.  
  301. DMAWAIT:    
  302.     movem.l    d0-d7,-(a7)
  303.  
  304.     move.l    $dff004,d0
  305.     and.l    #$1ff00,d0
  306.     
  307. .wait    move.l    $dff004,d1
  308.     and.l    #$1ff00,d1
  309.     
  310.     cmp.l    d0,d1
  311.     beq.s    .wait
  312.  
  313.  
  314.     movem.l    (a7)+,d0-d7
  315.     
  316.     rts
  317.     
  318.  
  319. RealTempo    dc.w 125
  320.  
  321. n_note        EQU    0  ; W
  322. n_cmd        EQU    2  ; W
  323. n_cmdlo        EQU    3  ; B
  324. n_start        EQU    4  ; L
  325. n_length        EQU    8  ; W
  326. n_loopstart    EQU    10 ; L
  327. n_replen        EQU    14 ; W
  328. n_period        EQU    16 ; W
  329. n_finetune    EQU    18 ; B
  330. n_volume        EQU    19 ; B
  331. n_dmabit        EQU    20 ; W
  332. n_toneportdirec    EQU    22 ; B
  333. n_toneportspeed    EQU    23 ; B
  334. n_wantedperiod    EQU    24 ; W
  335. n_vibratocmd    EQU    26 ; B
  336. n_vibratopos    EQU    27 ; B
  337. n_tremolocmd    EQU    28 ; B
  338. n_tremolopos    EQU    29 ; B
  339. n_wavecontrol    EQU    30 ; B
  340. n_glissfunk    EQU    31 ; B
  341. n_sampleoffset    EQU    32 ; B
  342. n_pattpos    EQU    33 ; B
  343. n_loopcount    EQU    34 ; B
  344. n_funkoffset    EQU    35 ; B
  345. n_wavestart    EQU    36 ; L
  346. n_reallength    EQU    40 ; W
  347.  
  348. mt_init    
  349.     lea    mt_data,A0
  350.     MOVE.L    A0,mt_SongDataPtr
  351.     MOVE.L    A0,A1
  352.     LEA    952(A1),A1
  353.     MOVEQ    #127,D0
  354.     MOVEQ    #0,D1
  355. mtloop    MOVE.L    D1,D2
  356.     SUBQ.W    #1,D0
  357. mtloop2    MOVE.B    (A1)+,D1
  358.     CMP.B    D2,D1
  359.     BGT.S    mtloop
  360.     DBRA    D0,mtloop2
  361.     ADDQ.B    #1,D2
  362.             
  363.     LEA    mt_SampleStarts(PC),A1
  364.     ASL.L    #8,D2
  365.     ASL.L    #2,D2
  366.     ADD.L    #1084,D2
  367.     ADD.L    A0,D2
  368.     MOVE.L    D2,A2
  369.     MOVEQ    #30,D0
  370. mtloop3    CLR.L    (A2)
  371.     MOVE.L    A2,(A1)+
  372.     MOVEQ    #0,D1
  373.     MOVE.W    42(A0),D1
  374.     ASL.L    #1,D1
  375.     ADD.L    D1,A2
  376.     ADD.L    #30,A0
  377.     DBRA    D0,mtloop3
  378.  
  379.     OR.B    #2,$BFE001
  380.     MOVE.B    #6,mt_speed
  381.     CLR.B    mt_counter
  382.     CLR.B    mt_SongPos
  383.     CLR.W    mt_PatternPos
  384. mt_end    SF    mt_Enable
  385.     LEA    $DFF000,A0
  386.     CLR.W    $A8(A0)
  387.     CLR.W    $B8(A0)
  388.     CLR.W    $C8(A0)
  389.     CLR.W    $D8(A0)
  390.     MOVE.W    #$F,$DFF096
  391.     RTS
  392.  
  393. mt_music
  394.     MOVEM.L    D0-D4/A0-A6,-(SP)
  395.     TST.B    mt_Enable
  396.     BEQ    mt_exit
  397.     ADDQ.B    #1,mt_counter
  398.     MOVE.B    mt_counter(PC),D0
  399.     CMP.B    mt_speed(PC),D0
  400.     BLO.S    mt_NoNewNote
  401.     CLR.B    mt_counter
  402.     TST.B    mt_PattDelTime2
  403.     BEQ.S    mt_GetNewNote
  404.     BSR.S    mt_NoNewAllChannels
  405.     BRA    mt_dskip
  406.  
  407. mt_NoNewNote
  408.     BSR.S    mt_NoNewAllChannels
  409.     BRA    mt_NoNewPosYet
  410.  
  411. mt_NoNewAllChannels
  412.     LEA    $DFF0A0,A5
  413.     LEA    mt_chan1temp(PC),A6
  414.     BSR    mt_CheckEfx
  415.     LEA    $DFF0B0,A5
  416.     LEA    mt_chan2temp(PC),A6
  417.     BSR    mt_CheckEfx
  418.     LEA    $DFF0C0,A5
  419.     LEA    mt_chan3temp(PC),A6
  420.     BSR    mt_CheckEfx
  421.     LEA    $DFF0D0,A5
  422.     LEA    mt_chan4temp(PC),A6
  423.     BRA    mt_CheckEfx
  424.  
  425. mt_GetNewNote
  426.     MOVE.L    mt_SongDataPtr(PC),A0
  427.     LEA    12(A0),A3
  428.     LEA    952(A0),A2    ;pattpo
  429.     LEA    1084(A0),A0    ;patterndata
  430.     MOVEQ    #0,D0
  431.     MOVEQ    #0,D1
  432.     MOVE.B    mt_SongPos(PC),D0
  433.     MOVE.B    (A2,D0.W),D1
  434.     ASL.L    #8,D1
  435.     ASL.L    #2,D1
  436.     ADD.W    mt_PatternPos(PC),D1
  437.     CLR.W    mt_DMACONtemp
  438.  
  439.     LEA    $DFF0A0,A5
  440.     LEA    mt_chan1temp(PC),A6
  441.     BSR    mt_PlayVoice
  442.     
  443.     LEA    $DFF0B0,A5
  444.     LEA    mt_chan2temp(PC),A6
  445.     BSR.S    mt_PlayVoice
  446.     
  447.     LEA    $DFF0C0,A5
  448.     LEA    mt_chan3temp(PC),A6
  449.     BSR.S    mt_PlayVoice
  450.     
  451.     LEA    $DFF0D0,A5
  452.     LEA    mt_chan4temp(PC),A6
  453.     BSR.S    mt_PlayVoice
  454.  
  455.     BRA    mt_SetDMA
  456.  
  457. mt_PlayVoice
  458.     TST.L    (A6)
  459.     BNE.S    mt_plvskip
  460.     BSR    mt_PerNop
  461. mt_plvskip
  462.     MOVE.L    (A0,D1.L),(A6)
  463.     ADDQ.L    #4,D1
  464.     MOVEQ    #0,D2
  465.     MOVE.B    n_cmd(A6),D2
  466.     AND.B    #$F0,D2
  467.     LSR.B    #4,D2
  468.     MOVE.B    (A6),D0
  469.     AND.B    #$F0,D0
  470.     OR.B    D0,D2
  471.     TST.B    D2
  472.     BEQ    mt_SetRegs
  473.     MOVEQ    #0,D3
  474.     LEA    mt_SampleStarts(PC),A1
  475.     MOVE    D2,D4
  476.     SUBQ.L    #1,D2
  477.     ASL.L    #2,D2
  478.     MULU    #30,D4
  479.     MOVE.L    (A1,D2.L),n_start(A6)
  480.     MOVE.W    (A3,D4.L),n_length(A6)
  481.     MOVE.W    (A3,D4.L),n_reallength(A6)
  482.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  483.     MOVE.B    3(A3,D4.L),n_volume(A6)
  484.  
  485.     ******* my equ routine ****
  486.  
  487.     movem.l    a0-a6,-(a7)
  488.  
  489.     cmp.b    #0,n_volume(a6)
  490.     beq    no_vol
  491.  
  492.     move.l    ss,a0        ; sample start at
  493.     move.l    n_start(a6),(a0)
  494.  
  495.     move.l    sl,a0        ; sound length
  496.     move.w    n_length(a6),(a0)
  497.  
  498. no_vol:    movem.l    (a7)+,a0-a6
  499.     
  500.     *************************
  501.  
  502.     MOVE.W    4(A3,D4.L),D3         ; Get repeat
  503.     TST.W    D3
  504.     BEQ.S    mt_NoLoop
  505.     MOVE.L    n_start(A6),D2        ; Get start
  506.     ASL.W    #1,D3
  507.     ADD.L    D3,D2            ; Add repeat
  508.     MOVE.L    D2,n_loopstart(A6)
  509.     MOVE.L    D2,n_wavestart(A6)
  510.     MOVE.W    4(A3,D4.L),D0        ; Get repeat
  511.     ADD.W    6(A3,D4.L),D0        ; Add replen
  512.     MOVE.W    D0,n_length(A6)
  513.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  514.     MOVEQ    #0,D0
  515.     MOVE.B    n_volume(A6),D0
  516.     MOVE.W    D0,8(A5)    ; Set volume
  517.     BRA.S    mt_SetRegs
  518.  
  519. mt_NoLoop
  520.     MOVE.L    n_start(A6),D2
  521.     ADD.L    D3,D2
  522.     MOVE.L    D2,n_loopstart(A6)
  523.     MOVE.L    D2,n_wavestart(A6)
  524.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  525.     MOVEQ    #0,D0
  526.     MOVE.B    n_volume(A6),D0
  527.     MOVE.W    D0,8(A5)    ; Set volume
  528. mt_SetRegs
  529.     MOVE.W    (A6),D0
  530.     AND.W    #$0FFF,D0
  531.     BEQ    mt_CheckMoreEfx        ; If no note
  532.     MOVE.W    2(A6),D0
  533.     AND.W    #$0FF0,D0
  534.     CMP.W    #$0E50,D0
  535.     BEQ.S    mt_DoSetFineTune
  536.     MOVE.B    2(A6),D0
  537.     AND.B    #$0F,D0
  538.     CMP.B    #3,D0    ; TonePortamento
  539.     BEQ.S    mt_ChkTonePorta
  540.     CMP.B    #5,D0
  541.     BEQ.S    mt_ChkTonePorta
  542.     CMP.B    #9,D0    ; Sample Offset
  543.     BNE.S    mt_SetPeriod
  544.     BSR    mt_CheckMoreEfx
  545.     BRA.S    mt_SetPeriod
  546.  
  547. mt_DoSetFineTune
  548.     BSR    mt_SetFineTune
  549.     BRA.S    mt_SetPeriod
  550.  
  551. mt_ChkTonePorta
  552.     BSR    mt_SetTonePorta
  553.     BRA    mt_CheckMoreEfx
  554.  
  555. mt_SetPeriod
  556.     MOVEM.L    D0-D1/A0-A1,-(SP)
  557.     MOVE.W    (A6),D1
  558.     AND.W    #$0FFF,D1
  559.     LEA    mt_PeriodTable(PC),A1
  560.     MOVEQ    #0,D0
  561.     
  562.     MOVEQ    #36,D2
  563. mt_ftuloop
  564.     CMP.W    (A1,D0.W),D1
  565.     BHS.S    mt_ftufound
  566.     ADDQ.L    #2,D0
  567.     DBRA    D2,mt_ftuloop        ;;;; speed me up!
  568. mt_ftufound
  569.     
  570.  
  571.     MOVEQ    #0,D1
  572.     MOVE.B    n_finetune(A6),D1
  573.     MULU    #36*2,D1
  574.     ADD.L    D1,A1
  575.     MOVE.W    (A1,D0.W),n_period(A6)
  576.     MOVEM.L    (SP)+,D0-D1/A0-A1
  577.  
  578.     MOVE.W    2(A6),D0
  579.     AND.W    #$0FF0,D0
  580.     CMP.W    #$0ED0,D0 ; Notedelay
  581.     BEQ    mt_CheckMoreEfx
  582.  
  583.     MOVE.W    n_dmabit(A6),$DFF096
  584.     BTST    #2,n_wavecontrol(A6)
  585.     BNE.S    mt_vibnoc
  586.     CLR.B    n_vibratopos(A6)
  587. mt_vibnoc
  588.     BTST    #6,n_wavecontrol(A6)
  589.     BNE.S    mt_trenoc
  590.     CLR.B    n_tremolopos(A6)
  591. mt_trenoc
  592.     MOVE.L    n_start(A6),(A5)        ; Set start
  593.     MOVE.W    n_length(A6),4(A5)    ; Set length
  594.     MOVE.W    n_period(A6),D0
  595.     MOVE.W    D0,6(A5)            ; Set period
  596.     MOVE.W    n_dmabit(A6),D0
  597.     OR.W    D0,mt_DMACONtemp
  598.     BRA    mt_CheckMoreEfx
  599.  
  600. mt_SetDMA
  601.     bsr    DMAWAIT
  602.  
  603.     MOVE.W    mt_DMACONtemp(PC),D0
  604.     OR.W    #$8000,D0
  605.     MOVE.W    D0,$DFF096
  606.  
  607.     bsr    DMAWAIT
  608.  
  609.     ************
  610.  
  611.     LEA    mt_chan1temp(PC),A6
  612.     move.w    n_period(a6),a5
  613.     cmp.w    showlen1,a5
  614.     ble    no_sound1
  615.     cmp.b    #0,n_volume(a6)
  616.     beq    no_sound1
  617.     move.l    n_loopstart(a6),showsound1
  618.     move.w    n_replen(a6),showlen1
  619. no_sound1:
  620.  
  621.     LEA    mt_chan2temp(PC),A6
  622.     move.w    n_period(a6),a5
  623.     cmp.w    showlen2,a5
  624.     ble    no_sound2
  625.     cmp.b    #0,n_volume(a6)
  626.     beq    no_sound2
  627.     move.l    n_loopstart(a6),showsound2
  628.     move.w    n_replen(a6),showlen2
  629. no_sound2:
  630.  
  631.     LEA    mt_chan3temp(PC),A6
  632.     move.w    n_period(a6),a5
  633.     cmp.w    showlen3,a5
  634.     ble    no_sound3
  635.     cmp.b    #0,n_volume(a6)
  636.     beq    no_sound3
  637.     move.l    n_loopstart(a6),showsound3
  638.     move.w    n_replen(a6),showlen3
  639. no_sound3:
  640.  
  641.     LEA    mt_chan4temp(PC),A6
  642.     move.w    n_period(a6),a5
  643.     cmp.w    showlen4,a5
  644.     ble    no_sound4
  645.     cmp.b    #0,n_volume(a6)
  646.     beq    no_sound4
  647.     move.l    n_loopstart(a6),showsound4
  648.     move.w    n_replen(a6),showlen4
  649. no_sound4:
  650.  
  651.     ************
  652.  
  653.  
  654.     LEA    $DFF000,A5
  655.     LEA    mt_chan4temp(PC),A6
  656.     MOVE.L    n_loopstart(A6),$D0(A5)
  657.     MOVE.W    n_replen(A6),$D4(A5)
  658.     LEA    mt_chan3temp(PC),A6
  659.     MOVE.L    n_loopstart(A6),$C0(A5)
  660.     MOVE.W    n_replen(A6),$C4(A5)
  661.     LEA    mt_chan2temp(PC),A6
  662.     MOVE.L    n_loopstart(A6),$B0(A5)
  663.     MOVE.W    n_replen(A6),$B4(A5)
  664.     LEA    mt_chan1temp(PC),A6
  665.     MOVE.L    n_loopstart(A6),$A0(A5)
  666.     MOVE.W    n_replen(A6),$A4(A5)
  667.  
  668. mt_dskip
  669.     ADD.W    #16,mt_PatternPos
  670.     MOVE.B    mt_PattDelTime,D0
  671.     BEQ.S    mt_dskc
  672.     MOVE.B    D0,mt_PattDelTime2
  673.     CLR.B    mt_PattDelTime
  674. mt_dskc    TST.B    mt_PattDelTime2
  675.     BEQ.S    mt_dska
  676.     SUBQ.B    #1,mt_PattDelTime2
  677.     BEQ.S    mt_dska
  678.     SUB.W    #16,mt_PatternPos
  679. mt_dska    TST.B    mt_PBreakFlag
  680.     BEQ.S    mt_nnpysk
  681.     SF    mt_PBreakFlag
  682.     MOVEQ    #0,D0
  683.     MOVE.B    mt_PBreakPos(PC),D0
  684.     CLR.B    mt_PBreakPos
  685.     LSL.W    #4,D0
  686.     MOVE.W    D0,mt_PatternPos
  687. mt_nnpysk
  688.     CMP.W    #1024,mt_PatternPos
  689.     BLO.S    mt_NoNewPosYet
  690. mt_NextPosition    
  691.     MOVEQ    #0,D0
  692.     MOVE.B    mt_PBreakPos(PC),D0
  693.     LSL.W    #4,D0
  694.     MOVE.W    D0,mt_PatternPos
  695.     CLR.B    mt_PBreakPos
  696.     CLR.B    mt_PosJumpFlag
  697.     ADDQ.B    #1,mt_SongPos
  698.     AND.B    #$7F,mt_SongPos
  699.     MOVE.B    mt_SongPos(PC),D1
  700.     MOVE.L    mt_SongDataPtr(PC),A0
  701.     CMP.B    950(A0),D1
  702.     BLO.S    mt_NoNewPosYet
  703.     CLR.B    mt_SongPos
  704. mt_NoNewPosYet    
  705.     TST.B    mt_PosJumpFlag
  706.     BNE.S    mt_NextPosition
  707. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  708.     RTS
  709.  
  710. mt_CheckEfx
  711.     movem.l    d0-d7/a0-a6,-(a7)
  712.  
  713.     ********* my equ routines *********
  714.  
  715.     LEA    mt_chan1temp(PC),A6
  716.     cmp.w    #0,n_cmd(A6)
  717.     beq    no_restart_1a
  718.     move.l    n_loopstart(a6),showsound1
  719.     move.w    n_length(a6),showlen1
  720.         
  721. no_restart_1a:
  722.     
  723.     LEA    mt_chan2temp(PC),A6
  724.     cmp.w    #0,n_cmd(A6)
  725.     beq    no_restart_2a
  726.     move.l    n_loopstart(a6),showsound2
  727.     move.w    n_length(a6),showlen2
  728. no_restart_2a:
  729.     
  730.     LEA    mt_chan3temp(PC),A6
  731.     cmp.w    #0,n_cmd(A6)
  732.     beq    no_restart_3a
  733.     move.l    n_loopstart(a6),showsound3
  734.     move.w    n_length(a6),showlen3
  735. no_restart_3a:
  736.     
  737.     LEA    mt_chan4temp(PC),A6
  738.     cmp.w    #0,n_cmd(A6)
  739.     beq    no_restart_4a
  740.     move.l    n_loopstart(a6),showsound4
  741.     move.w    n_length(a6),showlen4
  742. no_restart_4a:
  743.  
  744.     ************************************
  745.  
  746.     movem.l    (a7)+,d0-d7/a0-a6
  747.  
  748.     BSR    mt_UpdateFunk
  749.     MOVE.W    n_cmd(A6),D0
  750.     AND.W    #$0FFF,D0
  751.     BEQ.S    mt_PerNop
  752.     MOVE.B    n_cmd(A6),D0
  753.     AND.B    #$0F,D0
  754.     BEQ.S    mt_Arpeggio
  755.     CMP.B    #1,D0
  756.     BEQ    mt_PortaUp
  757.     CMP.B    #2,D0
  758.     BEQ    mt_PortaDown
  759.     CMP.B    #3,D0
  760.     BEQ    mt_TonePortamento
  761.     CMP.B    #4,D0
  762.     BEQ    mt_Vibrato
  763.     CMP.B    #5,D0
  764.     BEQ    mt_TonePlusVolSlide
  765.     CMP.B    #6,D0
  766.     BEQ    mt_VibratoPlusVolSlide
  767.     CMP.B    #$E,D0
  768.     BEQ    mt_E_Commands
  769. SetBack    MOVE.W    n_period(A6),6(A5)
  770.     CMP.B    #7,D0
  771.     BEQ    mt_Tremolo
  772.     CMP.B    #$A,D0
  773.     BEQ    mt_VolumeSlide
  774. mt_Return
  775.     RTS
  776.  
  777. mt_PerNop
  778.     MOVE.W    n_period(A6),6(A5)
  779.     RTS
  780.  
  781. mt_Arpeggio
  782.     MOVEQ    #0,D0
  783.     MOVE.B    mt_counter(PC),D0
  784.     DIVS    #3,D0
  785.     SWAP    D0
  786.     CMP.W    #0,D0
  787.     BEQ.S    mt_Arpeggio2
  788.     CMP.W    #2,D0
  789.     BEQ.S    mt_Arpeggio1
  790.     MOVEQ    #0,D0
  791.     MOVE.B    n_cmdlo(A6),D0
  792.     LSR.B    #4,D0
  793.     BRA.S    mt_Arpeggio3
  794.  
  795. mt_Arpeggio1
  796.     MOVEQ    #0,D0
  797.     MOVE.B    n_cmdlo(A6),D0
  798.     AND.B    #15,D0
  799.     BRA.S    mt_Arpeggio3
  800.  
  801. mt_Arpeggio2
  802.     MOVE.W    n_period(A6),D2
  803.     BRA.S    mt_Arpeggio4
  804.  
  805. mt_Arpeggio3
  806.     ASL.W    #1,D0
  807.     MOVEQ    #0,D1
  808.     MOVE.B    n_finetune(A6),D1
  809.     MULU    #36*2,D1
  810.     LEA    mt_PeriodTable(PC),A0
  811.     ADD.L    D1,A0
  812.     MOVEQ    #0,D1
  813.     MOVE.W    n_period(A6),D1
  814.     MOVEQ    #36,D3
  815. mt_arploop
  816.     MOVE.W    (A0,D0.W),D2
  817.     CMP.W    (A0),D1
  818.     BHS.S    mt_Arpeggio4
  819.     ADDQ.L    #2,A0
  820.     DBRA    D3,mt_arploop        ;;;;
  821.     RTS
  822.  
  823. mt_Arpeggio4
  824.     MOVE.W    D2,6(A5)
  825.     RTS
  826.  
  827. mt_FinePortaUp
  828.     TST.B    mt_counter
  829.     BNE.S    mt_Return
  830.     MOVE.B    #$0F,mt_LowMask
  831. mt_PortaUp
  832.     MOVEQ    #0,D0
  833.     MOVE.B    n_cmdlo(A6),D0
  834.     AND.B    mt_LowMask(PC),D0
  835.     MOVE.B    #$FF,mt_LowMask
  836.     SUB.W    D0,n_period(A6)
  837.     MOVE.W    n_period(A6),D0
  838.     AND.W    #$0FFF,D0
  839.     CMP.W    #113,D0
  840.     BPL.S    mt_PortaUskip
  841.     AND.W    #$F000,n_period(A6)
  842.     OR.W    #113,n_period(A6)
  843. mt_PortaUskip
  844.     MOVE.W    n_period(A6),D0
  845.     AND.W    #$0FFF,D0
  846.     MOVE.W    D0,6(A5)
  847.     RTS    
  848.  
  849. mt_FinePortaDown
  850.     TST.B    mt_counter
  851.     BNE    mt_Return
  852.     MOVE.B    #$0F,mt_LowMask
  853. mt_PortaDown
  854.     CLR.W    D0
  855.     MOVE.B    n_cmdlo(A6),D0
  856.     AND.B    mt_LowMask(PC),D0
  857.     MOVE.B    #$FF,mt_LowMask
  858.     ADD.W    D0,n_period(A6)
  859.     MOVE.W    n_period(A6),D0
  860.     AND.W    #$0FFF,D0
  861.     CMP.W    #856,D0
  862.     BMI.S    mt_PortaDskip
  863.     AND.W    #$F000,n_period(A6)
  864.     OR.W    #856,n_period(A6)
  865. mt_PortaDskip
  866.     MOVE.W    n_period(A6),D0
  867.     AND.W    #$0FFF,D0
  868.     MOVE.W    D0,6(A5)
  869.     RTS
  870.  
  871. mt_SetTonePorta
  872.     MOVE.L    A0,-(SP)
  873.     MOVE.W    (A6),D2
  874.     AND.W    #$0FFF,D2
  875.     MOVEQ    #0,D0
  876.     MOVE.B    n_finetune(A6),D0
  877.     MULU    #37*2,D0
  878.     LEA    mt_PeriodTable(PC),A0
  879.     ADD.L    D0,A0
  880.     MOVEQ    #0,D0
  881. mt_StpLoop
  882.     CMP.W    (A0,D0.W),D2
  883.     BHS.S    mt_StpFound
  884.     ADDQ.W    #2,D0
  885.     CMP.W    #37*2,D0
  886.     BLO.S    mt_StpLoop
  887.     MOVEQ    #35*2,D0
  888. mt_StpFound
  889.     MOVE.B    n_finetune(A6),D2
  890.     AND.B    #8,D2
  891.     BEQ.S    mt_StpGoss
  892.     TST.W    D0
  893.     BEQ.S    mt_StpGoss
  894.     SUBQ.W    #2,D0
  895. mt_StpGoss
  896.     MOVE.W    (A0,D0.W),D2
  897.     MOVE.L    (SP)+,A0
  898.     MOVE.W    D2,n_wantedperiod(A6)
  899.     MOVE.W    n_period(A6),D0
  900.     CLR.B    n_toneportdirec(A6)
  901.     CMP.W    D0,D2
  902.     BEQ.S    mt_ClearTonePorta
  903.     BGE    mt_Return
  904.     MOVE.B    #1,n_toneportdirec(A6)
  905.     RTS
  906.  
  907. mt_ClearTonePorta
  908.     CLR.W    n_wantedperiod(A6)
  909.     RTS
  910.  
  911. mt_TonePortamento
  912.     MOVE.B    n_cmdlo(A6),D0
  913.     BEQ.S    mt_TonePortNoChange
  914.     MOVE.B    D0,n_toneportspeed(A6)
  915.     CLR.B    n_cmdlo(A6)
  916. mt_TonePortNoChange
  917.     TST.W    n_wantedperiod(A6)
  918.     BEQ    mt_Return
  919.     MOVEQ    #0,D0
  920.     MOVE.B    n_toneportspeed(A6),D0
  921.     TST.B    n_toneportdirec(A6)
  922.     BNE.S    mt_TonePortaUp
  923. mt_TonePortaDown
  924.     ADD.W    D0,n_period(A6)
  925.     MOVE.W    n_wantedperiod(A6),D0
  926.     CMP.W    n_period(A6),D0
  927.     BGT.S    mt_TonePortaSetPer
  928.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  929.     CLR.W    n_wantedperiod(A6)
  930.     BRA.S    mt_TonePortaSetPer
  931.  
  932. mt_TonePortaUp
  933.     SUB.W    D0,n_period(A6)
  934.     MOVE.W    n_wantedperiod(A6),D0
  935.     CMP.W    n_period(A6),D0
  936.     BLT.S    mt_TonePortaSetPer
  937.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  938.     CLR.W    n_wantedperiod(A6)
  939.  
  940. mt_TonePortaSetPer
  941.     MOVE.W    n_period(A6),D2
  942.     MOVE.B    n_glissfunk(A6),D0
  943.     AND.B    #$0F,D0
  944.     BEQ.S    mt_GlissSkip
  945.     MOVEQ    #0,D0
  946.     MOVE.B    n_finetune(A6),D0
  947.     MULU    #36*2,D0
  948.     LEA    mt_PeriodTable(PC),A0
  949.     ADD.L    D0,A0
  950.     MOVEQ    #0,D0
  951. mt_GlissLoop
  952.     CMP.W    (A0,D0.W),D2
  953.     BHS.S    mt_GlissFound
  954.     ADDQ.W    #2,D0
  955.     CMP.W    #36*2,D0
  956.     BLO.S    mt_GlissLoop
  957.     MOVEQ    #35*2,D0
  958. mt_GlissFound
  959.     MOVE.W    (A0,D0.W),D2
  960. mt_GlissSkip
  961.     MOVE.W    D2,6(A5) ; Set period
  962.     RTS
  963.  
  964. mt_Vibrato
  965.     MOVE.B    n_cmdlo(A6),D0
  966.     BEQ.S    mt_Vibrato2
  967.     MOVE.B    n_vibratocmd(A6),D2
  968.     AND.B    #$0F,D0
  969.     BEQ.S    mt_vibskip
  970.     AND.B    #$F0,D2
  971.     OR.B    D0,D2
  972. mt_vibskip
  973.     MOVE.B    n_cmdlo(A6),D0
  974.     AND.B    #$F0,D0
  975.     BEQ.S    mt_vibskip2
  976.     AND.B    #$0F,D2
  977.     OR.B    D0,D2
  978. mt_vibskip2
  979.     MOVE.B    D2,n_vibratocmd(A6)
  980. mt_Vibrato2
  981.     MOVE.B    n_vibratopos(A6),D0
  982.     LEA    mt_VibratoTable(PC),A4
  983.     LSR.W    #2,D0
  984.     AND.W    #$001F,D0
  985.     MOVEQ    #0,D2
  986.     MOVE.B    n_wavecontrol(A6),D2
  987.     AND.B    #$03,D2
  988.     BEQ.S    mt_vib_sine
  989.     LSL.B    #3,D0
  990.     CMP.B    #1,D2
  991.     BEQ.S    mt_vib_rampdown
  992.     MOVE.B    #255,D2
  993.     BRA.S    mt_vib_set
  994. mt_vib_rampdown
  995.     TST.B    n_vibratopos(A6)
  996.     BPL.S    mt_vib_rampdown2
  997.     MOVE.B    #255,D2
  998.     SUB.B    D0,D2
  999.     BRA.S    mt_vib_set
  1000. mt_vib_rampdown2
  1001.     MOVE.B    D0,D2
  1002.     BRA.S    mt_vib_set
  1003. mt_vib_sine
  1004.     MOVE.B    (A4,D0.W),D2
  1005. mt_vib_set
  1006.     MOVE.B    n_vibratocmd(A6),D0
  1007.     AND.W    #15,D0
  1008.     MULU    D0,D2
  1009.     LSR.W    #7,D2
  1010.     MOVE.W    n_period(A6),D0
  1011.     TST.B    n_vibratopos(A6)
  1012.     BMI.S    mt_VibratoNeg
  1013.     ADD.W    D2,D0
  1014.     BRA.S    mt_Vibrato3
  1015. mt_VibratoNeg
  1016.     SUB.W    D2,D0
  1017. mt_Vibrato3
  1018.     MOVE.W    D0,6(A5)
  1019.     MOVE.B    n_vibratocmd(A6),D0
  1020.     LSR.W    #2,D0
  1021.     AND.W    #$003C,D0
  1022.     ADD.B    D0,n_vibratopos(A6)
  1023.     RTS
  1024.  
  1025. mt_TonePlusVolSlide
  1026.     BSR    mt_TonePortNoChange
  1027.     BRA    mt_VolumeSlide
  1028.  
  1029. mt_VibratoPlusVolSlide
  1030.     BSR.S    mt_Vibrato2
  1031.     BRA    mt_VolumeSlide
  1032.  
  1033. mt_Tremolo
  1034.     MOVE.B    n_cmdlo(A6),D0
  1035.     BEQ.S    mt_Tremolo2
  1036.     MOVE.B    n_tremolocmd(A6),D2
  1037.     AND.B    #$0F,D0
  1038.     BEQ.S    mt_treskip
  1039.     AND.B    #$F0,D2
  1040.     OR.B    D0,D2
  1041. mt_treskip
  1042.     MOVE.B    n_cmdlo(A6),D0
  1043.     AND.B    #$F0,D0
  1044.     BEQ.S    mt_treskip2
  1045.     AND.B    #$0F,D2
  1046.     OR.B    D0,D2
  1047. mt_treskip2
  1048.     MOVE.B    D2,n_tremolocmd(A6)
  1049. mt_Tremolo2
  1050.     MOVE.B    n_tremolopos(A6),D0
  1051.     LEA    mt_VibratoTable(PC),A4
  1052.     LSR.W    #2,D0
  1053.     AND.W    #$001F,D0
  1054.     MOVEQ    #0,D2
  1055.     MOVE.B    n_wavecontrol(A6),D2
  1056.     LSR.B    #4,D2
  1057.     AND.B    #$03,D2
  1058.     BEQ.S    mt_tre_sine
  1059.     LSL.B    #3,D0
  1060.     CMP.B    #1,D2
  1061.     BEQ.S    mt_tre_rampdown
  1062.     MOVE.B    #255,D2
  1063.     BRA.S    mt_tre_set
  1064. mt_tre_rampdown
  1065.     TST.B    n_vibratopos(A6)
  1066.     BPL.S    mt_tre_rampdown2
  1067.     MOVE.B    #255,D2
  1068.     SUB.B    D0,D2
  1069.     BRA.S    mt_tre_set
  1070. mt_tre_rampdown2
  1071.     MOVE.B    D0,D2
  1072.     BRA.S    mt_tre_set
  1073. mt_tre_sine
  1074.     MOVE.B    (A4,D0.W),D2
  1075. mt_tre_set
  1076.     MOVE.B    n_tremolocmd(A6),D0
  1077.     AND.W    #15,D0
  1078.     MULU    D0,D2
  1079.     LSR.W    #6,D2
  1080.     MOVEQ    #0,D0
  1081.     MOVE.B    n_volume(A6),D0
  1082.     TST.B    n_tremolopos(A6)
  1083.     BMI.S    mt_TremoloNeg
  1084.     ADD.W    D2,D0
  1085.     BRA.S    mt_Tremolo3
  1086. mt_TremoloNeg
  1087.     SUB.W    D2,D0
  1088. mt_Tremolo3
  1089.     BPL.S    mt_TremoloSkip
  1090.     CLR.W    D0
  1091. mt_TremoloSkip
  1092.     CMP.W    #$40,D0
  1093.     BLS.S    mt_TremoloOk
  1094.     MOVE.W    #$40,D0
  1095. mt_TremoloOk
  1096.     MOVE.W    D0,8(A5)
  1097.     MOVE.B    n_tremolocmd(A6),D0
  1098.     LSR.W    #2,D0
  1099.     AND.W    #$003C,D0
  1100.     ADD.B    D0,n_tremolopos(A6)
  1101.     RTS
  1102.  
  1103. mt_SampleOffset
  1104.     MOVEQ    #0,D0
  1105.     MOVE.B    n_cmdlo(A6),D0
  1106.     BEQ.S    mt_sononew
  1107.     MOVE.B    D0,n_sampleoffset(A6)
  1108. mt_sononew
  1109.     MOVE.B    n_sampleoffset(A6),D0
  1110.     LSL.W    #7,D0
  1111.     CMP.W    n_length(A6),D0
  1112.     BGE.S    mt_sofskip
  1113.     SUB.W    D0,n_length(A6)
  1114.     LSL.W    #1,D0
  1115.     ADD.L    D0,n_start(A6)
  1116.     RTS
  1117. mt_sofskip
  1118.     MOVE.W    #$0001,n_length(A6)
  1119.     RTS
  1120.  
  1121. mt_VolumeSlide
  1122.     MOVEQ    #0,D0
  1123.     MOVE.B    n_cmdlo(A6),D0
  1124.     LSR.B    #4,D0
  1125.     TST.B    D0
  1126.     BEQ.S    mt_VolSlideDown
  1127. mt_VolSlideUp
  1128.     ADD.B    D0,n_volume(A6)
  1129.     CMP.B    #$40,n_volume(A6)
  1130.     BMI.S    mt_vsuskip
  1131.     MOVE.B    #$40,n_volume(A6)
  1132. mt_vsuskip
  1133.     MOVE.B    n_volume(A6),D0
  1134.     MOVE.W    D0,8(A5)
  1135.     RTS
  1136.  
  1137. mt_VolSlideDown
  1138.     MOVEQ    #0,D0
  1139.     MOVE.B    n_cmdlo(A6),D0
  1140.     AND.B    #$0F,D0
  1141. mt_VolSlideDown2
  1142.     SUB.B    D0,n_volume(A6)
  1143.     BPL.S    mt_vsdskip
  1144.     CLR.B    n_volume(A6)
  1145. mt_vsdskip
  1146.     MOVE.B    n_volume(A6),D0
  1147.     MOVE.W    D0,8(A5)
  1148.     RTS
  1149.  
  1150. mt_PositionJump
  1151.     MOVE.B    n_cmdlo(A6),D0
  1152.     SUBQ.B    #1,D0
  1153.     MOVE.B    D0,mt_SongPos
  1154. mt_pj2    CLR.B    mt_PBreakPos
  1155.     ST     mt_PosJumpFlag
  1156.     RTS
  1157.  
  1158. mt_VolumeChange
  1159.     MOVEQ    #0,D0
  1160.     MOVE.B    n_cmdlo(A6),D0
  1161.     CMP.B    #$40,D0
  1162.     BLS.S    mt_VolumeOk
  1163.     MOVEQ    #$40,D0
  1164. mt_VolumeOk
  1165.     MOVE.B    D0,n_volume(A6)
  1166.     MOVE.W    D0,8(A5)
  1167.     RTS
  1168.  
  1169. mt_PatternBreak
  1170.     MOVEQ    #0,D0
  1171.     MOVE.B    n_cmdlo(A6),D0
  1172.     MOVE.L    D0,D2
  1173.     LSR.B    #4,D0
  1174.     MULU    #10,D0
  1175.     AND.B    #$0F,D2
  1176.     ADD.B    D2,D0
  1177.     CMP.B    #63,D0
  1178.     BHI.S    mt_pj2
  1179.     MOVE.B    D0,mt_PBreakPos
  1180.     ST    mt_PosJumpFlag
  1181.     RTS
  1182.  
  1183. mt_SetSpeed
  1184.     MOVEQ    #0,D0
  1185.     MOVE.B    3(A6),D0
  1186.     BEQ    mt_end
  1187.     CMP.B    #32,D0
  1188.     BHS    SetTempo
  1189.     CLR.B    mt_counter
  1190.     MOVE.B    D0,mt_speed
  1191.     RTS
  1192.  
  1193.  
  1194. mt_CheckMoreEfx
  1195.     BSR    mt_UpdateFunk
  1196.     MOVE.B    2(A6),D0
  1197.     AND.B    #$0F,D0
  1198.     CMP.B    #$9,D0
  1199.     BEQ    mt_SampleOffset
  1200.     CMP.B    #$B,D0
  1201.     BEQ    mt_PositionJump
  1202.     CMP.B    #$D,D0
  1203.     BEQ    mt_PatternBreak
  1204.     CMP.B    #$E,D0
  1205.     BEQ.S    mt_E_Commands
  1206.     CMP.B    #$F,D0
  1207.     BEQ    mt_SetSpeed
  1208.     CMP.B    #$C,D0
  1209.     BEQ    mt_VolumeChange
  1210.     BRA    mt_PerNop
  1211.  
  1212. mt_E_Commands
  1213.     MOVE.B    n_cmdlo(A6),D0
  1214.     AND.B    #$F0,D0
  1215.     LSR.B    #4,D0
  1216.     BEQ.S    mt_FilterOnOff
  1217.     CMP.B    #1,D0
  1218.     BEQ    mt_FinePortaUp
  1219.     CMP.B    #2,D0
  1220.     BEQ    mt_FinePortaDown
  1221.     CMP.B    #3,D0
  1222.     BEQ.S    mt_SetGlissControl
  1223.     CMP.B    #4,D0
  1224.     BEQ    mt_SetVibratoControl
  1225.     CMP.B    #5,D0
  1226.     BEQ    mt_SetFineTune
  1227.     CMP.B    #6,D0
  1228.     BEQ    mt_JumpLoop
  1229.     CMP.B    #7,D0
  1230.     BEQ    mt_SetTremoloControl
  1231.     CMP.B    #9,D0
  1232.     BEQ    mt_RetrigNote
  1233.     CMP.B    #$A,D0
  1234.     BEQ    mt_VolumeFineUp
  1235.     CMP.B    #$B,D0
  1236.     BEQ    mt_VolumeFineDown
  1237.     CMP.B    #$C,D0
  1238.     BEQ    mt_NoteCut
  1239.     CMP.B    #$D,D0
  1240.     BEQ    mt_NoteDelay
  1241.     CMP.B    #$E,D0
  1242.     BEQ    mt_PatternDelay
  1243.     CMP.B    #$F,D0
  1244.     BEQ    mt_FunkIt
  1245.     RTS
  1246.  
  1247. mt_FilterOnOff
  1248.     MOVE.B    n_cmdlo(A6),D0
  1249.     AND.B    #1,D0
  1250.     ASL.B    #1,D0
  1251.     AND.B    #$FD,$BFE001
  1252.     OR.B    D0,$BFE001
  1253.     RTS    
  1254.  
  1255. mt_SetGlissControl
  1256.     MOVE.B    n_cmdlo(A6),D0
  1257.     AND.B    #$0F,D0
  1258.     AND.B    #$F0,n_glissfunk(A6)
  1259.     OR.B    D0,n_glissfunk(A6)
  1260.     RTS
  1261.  
  1262. mt_SetVibratoControl
  1263.     MOVE.B    n_cmdlo(A6),D0
  1264.     AND.B    #$0F,D0
  1265.     AND.B    #$F0,n_wavecontrol(A6)
  1266.     OR.B    D0,n_wavecontrol(A6)
  1267.     RTS
  1268.  
  1269. mt_SetFineTune
  1270.     MOVE.B    n_cmdlo(A6),D0
  1271.     AND.B    #$0F,D0
  1272.     MOVE.B    D0,n_finetune(A6)
  1273.     RTS
  1274.  
  1275. mt_JumpLoop
  1276.     TST.B    mt_counter
  1277.     BNE    mt_Return
  1278.     MOVE.B    n_cmdlo(A6),D0
  1279.     AND.B    #$0F,D0
  1280.     BEQ.S    mt_SetLoop
  1281.     TST.B    n_loopcount(A6)
  1282.     BEQ.S    mt_jumpcnt
  1283.     SUBQ.B    #1,n_loopcount(A6)
  1284.     BEQ    mt_Return
  1285. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1286.     ST    mt_PBreakFlag
  1287.     RTS
  1288.  
  1289. mt_jumpcnt
  1290.     MOVE.B    D0,n_loopcount(A6)
  1291.     BRA.S    mt_jmploop
  1292.  
  1293. mt_SetLoop
  1294.     MOVE.W    mt_PatternPos(PC),D0
  1295.     LSR.W    #4,D0
  1296.     MOVE.B    D0,n_pattpos(A6)
  1297.     RTS
  1298.  
  1299. mt_SetTremoloControl
  1300.     MOVE.B    n_cmdlo(A6),D0
  1301.     AND.B    #$0F,D0
  1302.     LSL.B    #4,D0
  1303.     AND.B    #$0F,n_wavecontrol(A6)
  1304.     OR.B    D0,n_wavecontrol(A6)
  1305.     RTS
  1306.  
  1307. mt_RetrigNote
  1308.     MOVE.L    D1,-(SP)
  1309.     MOVEQ    #0,D0
  1310.     MOVE.B    n_cmdlo(A6),D0
  1311.     AND.B    #$0F,D0
  1312.     BEQ.S    mt_rtnend
  1313.     MOVEQ    #0,D1
  1314.     MOVE.B    mt_counter(PC),D1
  1315.     BNE.S    mt_rtnskp
  1316.     MOVE.W    (A6),D1
  1317.     AND.W    #$0FFF,D1
  1318.     BNE.S    mt_rtnend
  1319.     MOVEQ    #0,D1
  1320.     MOVE.B    mt_counter(PC),D1
  1321. mt_rtnskp
  1322.     DIVU    D0,D1
  1323.     SWAP    D1
  1324.     TST.W    D1
  1325.     BNE.S    mt_rtnend
  1326. mt_DoRetrig
  1327.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1328.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1329.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1330.  
  1331.     bsr    DMAWAIT
  1332.     
  1333.     MOVE.W    n_dmabit(A6),D0
  1334.     BSET    #15,D0
  1335.     MOVE.W    D0,$DFF096
  1336.     
  1337.     bsr    DMAWAIT
  1338.  
  1339.     MOVE.L    n_loopstart(A6),(A5)
  1340.     MOVE.L    n_replen(A6),4(A5)
  1341. mt_rtnend
  1342.     MOVE.L    (SP)+,D1
  1343.     RTS
  1344.  
  1345. mt_VolumeFineUp
  1346.     TST.B    mt_counter
  1347.     BNE    mt_Return
  1348.     MOVEQ    #0,D0
  1349.     MOVE.B    n_cmdlo(A6),D0
  1350.     AND.B    #$F,D0
  1351.     BRA    mt_VolSlideUp
  1352.  
  1353. mt_VolumeFineDown
  1354.     TST.B    mt_counter
  1355.     BNE    mt_Return
  1356.     MOVEQ    #0,D0
  1357.     MOVE.B    n_cmdlo(A6),D0
  1358.     AND.B    #$0F,D0
  1359.     BRA    mt_VolSlideDown2
  1360.  
  1361. mt_NoteCut
  1362.     MOVEQ    #0,D0
  1363.     MOVE.B    n_cmdlo(A6),D0
  1364.     AND.B    #$0F,D0
  1365.     CMP.B    mt_counter(PC),D0
  1366.     BNE    mt_Return
  1367.     CLR.B    n_volume(A6)
  1368.     MOVE.W    #0,8(A5)
  1369.     RTS
  1370.  
  1371. mt_NoteDelay
  1372.     MOVEQ    #0,D0
  1373.     MOVE.B    n_cmdlo(A6),D0
  1374.     AND.B    #$0F,D0
  1375.     CMP.B    mt_Counter,D0
  1376.     BNE    mt_Return
  1377.     MOVE.W    (A6),D0
  1378.     BEQ    mt_Return
  1379.     MOVE.L    D1,-(SP)
  1380.     BRA    mt_DoRetrig
  1381.  
  1382. mt_PatternDelay
  1383.     TST.B    mt_counter
  1384.     BNE    mt_Return
  1385.     MOVEQ    #0,D0
  1386.     MOVE.B    n_cmdlo(A6),D0
  1387.     AND.B    #$0F,D0
  1388.     TST.B    mt_PattDelTime2
  1389.     BNE    mt_Return
  1390.     ADDQ.B    #1,D0
  1391.     MOVE.B    D0,mt_PattDelTime
  1392.     RTS
  1393.  
  1394. mt_FunkIt
  1395.     TST.B    mt_counter
  1396.     BNE    mt_Return
  1397.     MOVE.B    n_cmdlo(A6),D0
  1398.     AND.B    #$0F,D0
  1399.     LSL.B    #4,D0
  1400.     AND.B    #$0F,n_glissfunk(A6)
  1401.     OR.B    D0,n_glissfunk(A6)
  1402.     TST.B    D0
  1403.     BEQ    mt_Return
  1404. mt_UpdateFunk
  1405.     MOVEM.L    A0/D1,-(SP)
  1406.     MOVEQ    #0,D0
  1407.     MOVE.B    n_glissfunk(A6),D0
  1408.     LSR.B    #4,D0
  1409.     BEQ.S    mt_funkend
  1410.     LEA    mt_FunkTable(PC),A0
  1411.     MOVE.B    (A0,D0.W),D0
  1412.     ADD.B    D0,n_funkoffset(A6)
  1413.     BTST    #7,n_funkoffset(A6)
  1414.     BEQ.S    mt_funkend
  1415.     CLR.B    n_funkoffset(A6)
  1416.  
  1417.     MOVE.L    n_loopstart(A6),D0
  1418.     MOVEQ    #0,D1
  1419.     MOVE.W    n_replen(A6),D1
  1420.     ADD.L    D1,D0
  1421.     ADD.L    D1,D0
  1422.     MOVE.L    n_wavestart(A6),A0
  1423.     ADDQ.L    #1,A0
  1424.     CMP.L    D0,A0
  1425.     BLO.S    mt_funkok
  1426.     MOVE.L    n_loopstart(A6),A0
  1427. mt_funkok
  1428.     MOVE.L    A0,n_wavestart(A6)
  1429.     MOVEQ    #-1,D0
  1430.     SUB.B    (A0),D0
  1431.     MOVE.B    D0,(A0)
  1432. mt_funkend
  1433.     MOVEM.L    (SP)+,A0/D1
  1434.     RTS
  1435.  
  1436.  
  1437. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1438.  
  1439. mt_VibratoTable    
  1440.     dc.b   0, 24, 49, 74, 97,120,141,161
  1441.     dc.b 180,197,212,224,235,244,250,253
  1442.     dc.b 255,253,250,244,235,224,212,197
  1443.     dc.b 180,161,141,120, 97, 74, 49, 24
  1444.  
  1445. mt_PeriodTable
  1446. ; Tuning 0, Normal
  1447.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1448.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1449.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1450. ; Tuning 1
  1451.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1452.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1453.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1454. ; Tuning 2
  1455.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1456.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1457.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1458. ; Tuning 3
  1459.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1460.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1461.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1462. ; Tuning 4
  1463.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1464.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1465.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1466. ; Tuning 5
  1467.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1468.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1469.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1470. ; Tuning 6
  1471.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1472.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1473.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1474. ; Tuning 7
  1475.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1476.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1477.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1478. ; Tuning -8
  1479.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1480.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1481.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1482. ; Tuning -7
  1483.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1484.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1485.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1486. ; Tuning -6
  1487.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1488.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1489.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1490. ; Tuning -5
  1491.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1492.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1493.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1494. ; Tuning -4
  1495.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1496.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1497.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1498. ; Tuning -3
  1499.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1500.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1501.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1502. ; Tuning -2
  1503.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1504.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1505.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1506. ; Tuning -1
  1507.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1508.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1509.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1510.  
  1511. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1512. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1513. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1514. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1515.  
  1516. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1517.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1518.  
  1519. mt_SongDataPtr    dc.l 0
  1520. mt_speed    dc.b 6
  1521. mt_counter    dc.b 0
  1522. mt_SongPos    dc.b 0
  1523. mt_PBreakPos    dc.b 0
  1524. mt_PosJumpFlag    dc.b 0
  1525. mt_PBreakFlag    dc.b 0
  1526. mt_LowMask    dc.b 0
  1527. mt_PattDelTime    dc.b 0
  1528. mt_PattDelTime2    dc.b 0
  1529. mt_Enable    dc.b 0
  1530. mt_PatternPos    dc.w 0
  1531. mt_DMACONtemp    dc.w 0
  1532. ciatime2:    dc.l    0
  1533.  
  1534. ;/* End of File */
  1535.  
  1536.  
  1537.     section    lard,data_c
  1538.  
  1539.  
  1540.  
  1541.     **********************************************
  1542.  
  1543.  
  1544.     
  1545. showsound1:        dc.l    0        
  1546. showsound2:        dc.l    0        
  1547. showsound3:        dc.l    0        
  1548. showsound4:        dc.l    0        
  1549. showlen1:        dc.l    0
  1550. showlen2:        dc.l    0
  1551. showlen3:        dc.l    0
  1552. showlen4:        dc.l    0
  1553. ss:        dc.l    0
  1554. sl:        dc.l    0
  1555.  
  1556.     *********
  1557.  
  1558. cf_copper:        dc.w    $100,$0200    ; 4 bp - lo res
  1559.         dc.w    $104,$a        ; bp control reg
  1560.         dc.w    $108,0        ; bp modulo - odd
  1561.         dc.w    $10a,0        ; bp modulo - even
  1562.         dc.w    $180,0        ; colour 0 to black
  1563.         dc.w    $102,0
  1564.         
  1565.         dc.w    $08e,$2c11    ; bp window start left
  1566.         dc.w    $090,$2cf1    ; bp window bot right
  1567.  
  1568.         dc.w    $94,$d0    ; bp stop horz
  1569.         dc.w    $92,$38
  1570.         
  1571.         dc.w    $120,0,$122,0
  1572.         dc.w    $124,0,$126,0
  1573.         dc.w    $128,0,$12a,0
  1574.         dc.w    $12c,0,$12e,0
  1575.         dc.w    $130,0,$132,0
  1576.         dc.w    $134,0,$136,0
  1577.         dc.w    $138,0,$13a,0
  1578.         dc.w    $13c,0,$13e,0
  1579.                 
  1580.         dc.w    $180,$000
  1581.  
  1582.         dc.w    $1c01,$fffe
  1583.         dc.w    $9c,$8010    ; irq set bits - restart copper
  1584.                 
  1585.         dc.w    $8a,0    ; strobe copper 2                
  1586.         
  1587.         dc.w    $ffff,$fffe    ; end of copper list
  1588.  
  1589. dead_copper:    dc.w    $ffff,$fffe    ; end of copper list
  1590.  
  1591.     
  1592.  
  1593. copper2_ptr:    dc.l    copper_spc1
  1594.         dc.l    copper_spc2
  1595.         
  1596. funk_size1:        dc.w    0
  1597. funk_size2:        dc.w    0
  1598. funk_size3:        dc.w    0
  1599. funk_size4:        dc.w    2
  1600.  
  1601. oldint:        dc.l    0
  1602. olddma:        dc.l    0
  1603. oldv3:        dc.l    0
  1604. gfxlib:        dc.b    "graphics.library",0
  1605.         even
  1606.  
  1607. efbin:        incbin    "dh0:data/joes/data/efunk.bin"
  1608. efbinend:        
  1609.  
  1610. calcedsintable:    ds.l    $7fe
  1611.  
  1612. sintable:        incbin    "dh0:data/misc/sin.maxi"
  1613.         incbin    "dh0:data/misc/sin.maxi"
  1614.         incbin    "dh0:data/misc/sin.maxi"
  1615.         incbin    "dh0:data/misc/sin.maxi"
  1616.  
  1617. copper_spc1:    ds.l    1800
  1618. copper_spc2:    ds.l    1800
  1619.  
  1620. mt_data:        incbin    "dh0:data/joes/mods/mod.joes#03"
  1621.  
  1622. null:        dcb.b    256,0
  1623.  
  1624. sampletable:    
  1625.  
  1626. a set 128
  1627.     rept 128
  1628.     dc.b    a
  1629. a set a+1
  1630.     endr
  1631.     
  1632. a set 0
  1633.     rept 128
  1634.     dc.b    a
  1635. a set a+1
  1636.     endr
  1637.  
  1638. red_coltrans:    dc.w    $000,$100,$200,$300,$400,$500,$600,$700,$800,$900,$a00,$b00,$c00,$d00,$e00,$f00
  1639. green_coltrans:    dc.w    $000,$010,$020,$030,$040,$050,$060,$070,$080,$090,$0a0,$0b0,$0c0,$0d0,$0e0,$0f0
  1640. blue_coltrans:    dc.w    $000,$001,$002,$003,$004,$005,$006,$007,$008,$009,$00a,$00b,$00c,$00d,$00e,$00f
  1641. yellow_coltrans:    dc.w    $000,$110,$220,$330,$440,$550,$660,$770,$880,$990,$aa0,$bb0,$cc0,$dd0,$ee0,$ff0
  1642.  
  1643.     end
  1644.     
  1645.  
  1646.  
  1647.                 
  1648.  
  1649.